package com.wondersgroup.insurance.dnuilearn.recyclerview.touch;

import android.content.Context;
import android.support.annotation.Nullable;
import android.support.v4.view.MotionEventCompat;
import android.support.v4.view.ViewConfigurationCompat;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.ViewConfiguration;

/**
 * Created by Administrator on 2017/6/26.
 */

public class BetterRecyclerView extends RecyclerView {
    private int touchSlop;
    private Context mContext;
    private int INVALID_POINTER = -1;
    private int scrollPointerId = INVALID_POINTER;
    private int initialTouchX;
    private int initialTouchY;
    private final static String TAG = "BetterRecyclerView";

    public BetterRecyclerView(Context context) {
        this(context, null);
    }

    public BetterRecyclerView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public BetterRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        ViewConfiguration vc = ViewConfiguration.get(context);
        touchSlop = vc.getScaledEdgeSlop();
        mContext = context;
    }

    // //设置touch越界 [TOUCH_SLOP_DEFAULT/TOUCH_SLOP_PAGING]
    @Override
    public void setScrollingTouchSlop(int slopConstant) {
        super.setScrollingTouchSlop(slopConstant);
        ViewConfiguration vc = ViewConfiguration.get(mContext);
        switch (slopConstant) {
            case TOUCH_SLOP_DEFAULT:
                touchSlop = vc.getScaledTouchSlop();
                break;
            case TOUCH_SLOP_PAGING:
                touchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(vc);
                break;

        }
    }


//    @Override
//    public boolean onInterceptTouchEvent(MotionEvent e) {
//        if (e == null) {
//            return false;
//        }
//
//    /*
//    http://www.jianshu.com/p/0c863bbde8eb
//        http://blog.csdn.net/bigconvience/article/details/26611003
//        getAction()方法返回的是int类型，用到的只有低16位，其中：低八位是动作的类型，高8位是触摸点索引值的表示（单点为0，双点为1）
//        获得动作类型： int action = event.getAction() & ACTION_MASK 或者使用 getActionMasked()
//
//        获得触摸点索引类型： int pointerIndex = (event.getAction() & ACTION_POINTER_INDEX_MASK ) >> ACTION_POINTER_INDEX_SHIFT
//        或者使用 getActionIndex()
//
//        下面的代码段能使用户在屏幕上拖动一个对象。它记录了初始点的位置，计算点移动的距离，并将对象移动到新的位置。它正确的处理了这种情况：
//        当第一个手指把控件拖到一个位置，然后按下第二个手指，且第二个手指与同一个控件上。
//        当用户抬起第一个手指时，控件不会跑到第二个手指的位置同时第二个手指可以继续拖动控件。
//
//        为了可以表示多个触摸点的动作，MotionEvent中引入了Pointer的概念，一个pointer就代表一个触摸点，每个pointer都有自己的事件类型，
//        也有自己的横轴坐标值。
//        一个MotionEvent对象中可能会存储多个pointer的相关信息，每个pointer都会有一个自己的id和index。
//        pointer的id在整个事件流中是不会发生变化的，但是index会发生变化。
// MotionEvent类中的很多方法都是可以传入一个int值作为参数的，其实传入的就是pointer的index值。比如getX(pointerIndex)和getY(pointerIndex)，
//此时，它们返回的就是index所代表的触摸点相关事件坐标值。
// 由于pointer的index值在不同的MotionEvent对象中会发生变化，但是id值却不会变化。所以，当我们要记录一个触摸点的事件流时，
//就只需要保存其id,然后使用findPointerIndex(int)来获得其index值，然后再获得其他信息。
//        */
//
//
//
//
//        final int action = MotionEventCompat.getActionMasked(e);//动作的类型
//        int actionIndex = MotionEventCompat.getActionIndex(e);//获得触摸点索引类型
//        switch (action){
//            case MotionEvent.ACTION_DOWN :
//                scrollPointerId = MotionEventCompat.getPointerId(e, 0);
//                initialTouchX = Math.round(e.getX() + 0.5f);
//                initialTouchY = Math.round(e.getY() + 0.5f);
//
//                return super.onInterceptTouchEvent(e);
//            case MotionEvent.ACTION_POINTER_DOWN:
//                scrollPointerId = MotionEventCompat.getPointerId(e, actionIndex);
//
//                initialTouchX = Math.round(e.getX() + 0.5f);
//                initialTouchY = Math.round(e.getY() + 0.5f);
//                return super.onInterceptTouchEvent(e);
//            case MotionEvent.ACTION_MOVE:
//                int index = MotionEventCompat.findPointerIndex(e, scrollPointerId);
//                if (index < 0) {
//                    return false;
//                }
//                int x = Math.round(MotionEventCompat.getX(e, index) + 0.5f);
//                int y = Math.round(MotionEventCompat.getY(e, index) + 0.5f);
//                if (getScrollState() != SCROLL_STATE_DRAGGING ) {
//                    int dx = x - initialTouchX;
//                    int dy = y - initialTouchY;
//                    boolean startScroll = false;
//                    //将斜率添加进来，这样可以减少 startScroll 为true 的机会。这个机会就会给需要这个返回值
//                    if (getLayoutManager().canScrollHorizontally() && Math.abs(dx) > touchSlop &&
//                            (getLayoutManager().canScrollVertically() || Math.abs(dx) > Math.abs(dy))) {
//                        startScroll = true;
//                    }
//                    if(getLayoutManager().canScrollVertically() && Math.abs(dy) > touchSlop &&
//                            (getLayoutManager().canScrollHorizontally() || Math.abs(dy) > Math.abs(dx))) {
//                        startScroll = true;
//                    }
//                    Log.d(TAG, "startScroll: " + startScroll);
//                    return startScroll && super.onInterceptTouchEvent(e);
//                }
//                return super.onInterceptTouchEvent(e);
//
//            default:
//                return super.onInterceptTouchEvent(e);
//
//        }
//
//    }


    @Override
    public boolean onInterceptTouchEvent(MotionEvent e) {

        if (e == null){
            return false;
        }
        int action = e.getAction();
        int actionIndex = MotionEventCompat.getActionIndex(e);
        switch (action){
            case MotionEvent.ACTION_DOWN:
                scrollPointerId = MotionEventCompat.getPointerId(e,0);
                initialTouchX = Math.round(e.getX() + 0.5f);
                initialTouchY = Math.round(e.getY() + 0.5f);
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                scrollPointerId= MotionEventCompat.getPointerId(e,actionIndex);
                initialTouchX = Math.round(e.getX() + 0.5f);
                initialTouchY = Math.round(e.getY() + 0.5f);
                break;
            case MotionEvent.ACTION_MOVE:
               int index = e.findPointerIndex(scrollPointerId);
                if (index < 0){
                    break;
                }

                if (getScrollState() == SCROLL_STATE_DRAGGING){
                    break;
                }
                int x = Math.round( MotionEventCompat.getX(e,index) + 0.5f);
                int y = Math.round( MotionEventCompat.getY(e,index) + 0.5f);
                int dx = Math.abs(x - initialTouchX);
                int dy = Math.abs(y-initialTouchY);
                boolean startScroll = false;
                if (getLayoutManager().canScrollHorizontally() && dx>touchSlop  && (getLayoutManager().canScrollVertically()|| dx >dy)){
                    startScroll = true;
                }
                if (getLayoutManager().canScrollVertically() && dy>touchSlop  && (getLayoutManager().canScrollHorizontally()|| dy >dx)) {
                    startScroll = true;

                }
                    return startScroll && super.onInterceptTouchEvent(e);
        }
        return super.onInterceptTouchEvent(e);
    }


}
